package com.jichangxiu.common.utils;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.jichangxiu.common.constant.Constants;
import com.jichangxiu.common.entity.bo.Record;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Objects;

public class FileUtils {

    // 验证文件大小
    public static void checkFileSize(MultipartFile file) {
        // 文件大小(B)
        long size = file.getSize();
        if (size > Constants.JCX_PROPERTIES.getFileProperties().getMaxSize()) {
            throw new RuntimeException("【FileUtils】文件大小超出限制");
        }
    }

    // 获取文件后缀
    public static String getSuffixName(String fileName) {
        return fileName.substring(fileName.lastIndexOf(".") + 1);
    }

    // 验证指定文件名是否存在于指定后缀列表中
    public static void checkSuffix(String fileName, String suffixList) {
        // 获取后缀，并转为小写
        String ext = getSuffixName(fileName).toLowerCase();
        // 去空格，加逗号
        String yxSuffix = suffixList.replace(" ", "") + ",";
        if (!yxSuffix.contains(ext + ",")) {
            throw new RuntimeException("【FileUtils】文件后缀验证未通过 【" + ext + "】");
        }
    }

    // 返回今天的日期用作文件夹
    public static String getCurrDateFolder() {
        String yyyy = new SimpleDateFormat("yyyy").format(new Date());
        String mm = new SimpleDateFormat("MM").format(new Date());
        String dd = new SimpleDateFormat("dd").format(new Date());
        return yyyy + File.separator + mm + File.separator + dd;
    }

    public static String getCurrDateUrl() {
        String yyyy = new SimpleDateFormat("yyyy").format(new Date());
        String mm = new SimpleDateFormat("MM").format(new Date());
        String dd = new SimpleDateFormat("dd").format(new Date());
        return yyyy + "/" + mm + "/" + dd;
    }

    // 返回本服务器域名信息
    public static String getDoMain() {
        return Constants.JCX_PROPERTIES.getFileProperties().getDomain();
    }

    // 将文件名保存在服务器硬盘上，并把文件对应的http地址返回给前台
    public static Record saveFile(MultipartFile file, String fileTypeFolder) {
        if (ObjectUtil.isEmpty(file)) {
            throw new RuntimeException("【FileUtils】文件为空");
        }
        // 1、计算路径
        // 根据日期计算需要保存的文件夹
        String currDateFolder = getCurrDateFolder();
        // 文件在系统的唯一标识
        String fileId = IdWorker.get32UUID();
        // 文件名
        String fileName = fileId + "." + getSuffixName(Objects.requireNonNull(file.getOriginalFilename()));
        // 需要保存到的文件夹地址
        // /jcx-file/upload/image/2023/04/15
        String fileFolder = new File(Constants.JCX_PROPERTIES.getFileProperties().getRootFolder()).getAbsolutePath() + File.separator +
                Constants.JCX_PROPERTIES.getFileProperties().getUploadPrefix() + File.separator + fileTypeFolder + File.separator + currDateFolder + File.separator;
        // 对外暴露的http路径
        String fileUrl = getDoMain() + Constants.JCX_PROPERTIES.getFileProperties().getActionPrefix() + "/" + Constants.JCX_PROPERTIES.getFileProperties().getUploadPrefix() + "/" + fileTypeFolder + "/" + getCurrDateUrl() + "/" + fileName;
        // 2、如果文件夹不存在，则先创建
        File dirFile = new File(fileFolder);
        if (!dirFile.exists()) {
            dirFile.mkdirs();
        }
        // 3、开始转存文件
        try {
            File outFile = new File(fileFolder + fileName);
            file.transferTo(outFile);
        } catch (Exception ex) {
            throw new RuntimeException("【FileUtils】文件保存出错", ex);
        }
        // 4、将文件外网地址返回给前台
        return Record.getRecord("fileId", fileId).set("fileUrl", fileUrl);
    }

}
